/*
 * cesar_cliente.c:  version remota de "cesar_local.c" 
 * Envia un mensaje para ser cifrado/recuperado utilizando codificación cesar.
 *	Si fue exitoso muestra el resultado.
 *	Sino recibe mensaje de error.
 *   Usa TCP como capa de transporte
 */
#include <stdio.h>
#include <rpc/rpc.h>		
#include "cesar.h"

#define NINGUNO 0
#define ARGUMENTOS 1
#define FALTA_SERVIDOR 2
#define ERROR_EN_CYPHER 3
#define ERROR_EN_UNCYPHER 4
#define ERROR_EN_CESAR 5

//#define USANDO_CYPHER_Y_UNCYPHER 1
#ifndef USANDO_STRUCT
	#ifndef USANDO_CYPHER_Y_UNCYPHER
		#define USANDO_STRUCT 1
	#endif
#endif

extern int cod_ret;
int main(int argc, char *argv[])
{
	CLIENT *cl;       /* estructura para el handle */
	static struct retorno *vuelta;

	const char* server = NULL;	
	int clave = 0;

	if (argc < 4) {
		fprintf(stdout,"Modo de uso: %s server clave mensaje\n",argv[0]);
		return  (ARGUMENTOS);
	}
	if (argc > 4)
		fprintf(stdout,"%s: Advertencia, se toma como mensaje el primer argumento libre, para enviar un mensaje con espacios usar comillas.\n",argv[0]);

	server = argv[1];
	clave = atoi(argv[2]);
	if (clave == 0) {
		fprintf(stdout,"%s: La clave no debe ser 0.\n",argv[0]);
		return (ARGUMENTOS);
	}
	
	if (clave > 0)
		fprintf(stdout,"%s: Cifrando:\t\"%s\" con clave %d.\n",argv[0],argv[3],clave);
	else
		fprintf(stdout,"%s: Descifrando:\t\"%s\" con clave %d.\n",argv[0],argv[3],-clave);

#ifndef DEBUG
	cl = clnt_create(server,CESARPROG,CESARVERS,"tcp"); /* Obtener handle */
	if (cl == NULL) {
		clnt_pcreateerror(server);
		return  (FALTA_SERVIDOR);
	}
#endif /*DEBUG*/

#ifdef USANDO_STRUCT
	tMessageV2 m;
	m.clave = clave;
	strncpy (&(m.message[0]),argv[3],strlen(argv[3]));
	m.message[strlen(argv[3])] = '\0';
	
	vuelta = cesar_1(&m,cl);
	if (vuelta->cod_ret == 1)
		fprintf(stdout,"%s: Resultado:\t\"%s\".\n",argv[0],vuelta->retorno_u.message);
	else {
		fprintf(stdout,"%s: No se pudo cifrar el mensaje.\n",argv[0]);
		return (ERROR_EN_CESAR);
	} 

#elif defined USANDO_CYPHER_Y_UNCYPHER

	char mensaje[CESAR_MESSAGE_SIZE];
	char* pMensaje = &(mensaje[0]);
	mensaje[0] = (char)(abs(clave)%256);
	size_t len = strlen(argv[3]);
	strncpy(&(mensaje[1]),argv[3],len);
	if (strlen(argv[3]) < CESAR_MESSAGE_SIZE)
		mensaje[len+1] = '\0';

	if (clave >= 0) {
		vuelta = cypher_1(&pMensaje,cl);
		if (vuelta->cod_ret == 1) {
			fprintf(stdout,"%s: Resultado:\t\"%s\".\n",argv[0],vuelta->retorno_u.message);
		} else {
			fprintf(stdout,"%s: No se pudo cifrar el mensaje.\n",argv[0]);
			return (ERROR_EN_CYPHER);
		}
	} else {
		vuelta = uncypher_1(&pMensaje,cl);
		if (vuelta->cod_ret == 1) {
			fprintf(stdout,"%s: Resultado:\t\"%s\".\n",argv[0],vuelta->retorno_u.message);
		} else {
			fprintf(stdout,"%s: No se pudo descifrar el mensaje.\n",argv[0]);
			return  (ERROR_EN_UNCYPHER);
		}
	}
#endif

#ifndef	DEBUG
	clnt_destroy (cl);
#endif	 /* DEBUG */

	return(NINGUNO);
}
